package IO;

import javax.annotation.processing.Filer;
import java.io.*;

public class Demo3_FileStream {

    /**
     * 测试文件字节输入流
     */
    public static void fileInputStreamTest() throws Exception {

        FileInputStream fis = new FileInputStream("D://test.txt");

        //调用一次read方法只能读取一个字节
//        System.out.println((char)fis.read());

        //通过while循环的方式才能读取所有的内容，read方法如果得到最后返回的结果是 -1

        int temp;
//        while((temp = fis.read())!=-1){
//            System.out.println((char) temp);
//        }

        //可以通过字节数组的形式读取数据
        //每次读取的字节数是这个数组的长度
        //每次调用read(byte[])方法后，返回的是读到了几个字节，把具体的字节内容放在了这个数组中
        byte[] bTemp = new byte[2];
        while((temp = fis.read(bTemp))!=-1){
            //如果读到的真实字节数量不足，可能出现原来的字节没有被替换的情况，需要根据读到的实际长度进行获取
            System.out.println(new String(bTemp,0,temp));
        }

        fis.close();

    }


    /**
     * 测试文件字节输出流
     */
    public static void fileOutPutStreamTest() throws Exception {


        //以字符串类型的路径 创建一个文件字节输出流对象
//        FileOutputStream fos_str = new FileOutputStream("D://test.txt");
        //以File类型的路径 创建一个文件字节输出流对象
//        FileOutputStream fos_file = new FileOutputStream(new File("D://test.txt"));
        //以字符串类型的路径以追加的形式 创建一个文件字节输出流对象
        FileOutputStream fos_strAppend = new FileOutputStream("D://test.txt",true);
        //以File类型的路径以追加的形式 创建一个文件字节输出流对象
//        FileOutputStream fos_fileAppend = new FileOutputStream(new File("D://test.txt"),true);

        //字节形式必须以int类型写入
        fos_strAppend.write(97);
        fos_strAppend.write(98);
        fos_strAppend.write(99);

        fos_strAppend.write("\n".getBytes());

        //根据给定的字节数组写入内容
        fos_strAppend.write("你以为你以为的就是你以为的吗？".getBytes());
        fos_strAppend.write("\n".getBytes());

        //在字节数组的基础上，可以进行截取，但是注意中文并不是一个字符
        fos_strAppend.write("hello".getBytes(),2,3);

//        fos_strAppend.flush();

        fos_strAppend.close();

    }


    /**
     * 做文件的复制
     */
    public static void copyPicture() throws Exception {

        //定义一个输入流，把原图片读到内存中
        FileInputStream fis_pic = new FileInputStream("D:/data/data_spark/cute.jpg");
        //定义一个输出流，把内存中的图片写入到目标路径下
        FileOutputStream fos_pic = new FileOutputStream("D://copy.jpg");


        //定义一个缓冲数组，一般的长度是1k-2k
        byte[] temp = new byte[1024];
        int length;

        //循环读取的同时写入目标路径
        while((length = fis_pic.read(temp)) != -1){
            fos_pic.write(temp,0,length);
        }

        fos_pic.flush();
        fos_pic.close();
        fis_pic.close();

    }

    /**
     * 测试文件字符输出流
     */
    public static void fileWriterTest() throws Exception {

        FileWriter fw = new FileWriter("D://test.txt");

        fw.write(97);
        fw.write('a');
        fw.write("hello");

        fw.write("\n");

        char[] chars = {'w','o','r','l','d'};
        fw.write(chars);
        fw.write("\n");

        fw.write(chars,2,3);
        fw.write("\n");

        fw.write("success",1,4);

        fw.flush();
        fw.close();

    }

    public static void fileReaderTest() throws Exception {

        FileReader fr = new FileReader("D://test.txt");

//        int temp;
//        while((temp = fr.read())!=-1){
//            System.out.println((char) temp);
//        }

        char[] temp = new char[2];
        int length;
        while((length=fr.read(temp))!=-1){
            System.out.println(new String(temp,0,length));
        }

        fr.close();
    }

    /**
     * 复制文本文件
     * 使用字符流只能复制文本文件
     */
    public static void copyFile() throws Exception {

        FileReader fileReader = new FileReader("D://test.txt");
        FileWriter fileWriter = new FileWriter("D://copy.txt");

        char[] temp = new char[1024];
        int length;
        while((length=fileReader.read(temp))!=-1){

//            System.out.println(new String(temp,0,length));
            fileWriter.write(temp,0,length);
        }

        fileWriter.flush();
        fileWriter.close();
        fileReader.close();
    }

    public void IOExec(){

        FileReader fr = null;

        try {
            fr = new FileReader("");
        }catch (Exception e) {
            System.out.println("有异常");
        }finally {
            try {
                fr.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) throws Exception {
//        Demo3_FileStream.fileOutPutStreamTest();
//        Demo3_FileStream.fileInputStreamTest();
//        Demo3_FileStream.copyPicture();

//        Demo3_FileStream.fileWriterTest();

//        Demo3_FileStream.fileReaderTest();

        Demo3_FileStream.copyFile();

    }

}
